home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / EQMAC.SA < prev    next >
Text File  |  1987-03-04  |  24KB  |  1,458 lines

  1.  TTL '6809 FLOATING POINT PACKAGE - COPYRIGHT (C) MOTOROLA 1980'
  2.  OPT LLEN=120,NOG
  3. * TTL **** 6809 FLOATING POINT - COPYRIGHT(C) MOTOROLA 1980
  4.  
  5. *
  6. ***********************************************************************
  7. *
  8. *    G L O B A L  E Q U A T E S
  9. *
  10. *     THESE ARE THE GLOBAL EQUATES FOR THE 6809 FP PACKAGE
  11. *
  12. **********************************************************************
  13. *
  14. * BIT VALUES
  15. *
  16. BIT0 EQU 1
  17. BIT1 EQU 2
  18. BIT2 EQU 4
  19. BIT3 EQU 8
  20. BIT4 EQU 16
  21. BIT5 EQU 32
  22. BIT6 EQU 64
  23. BIT7 EQU 128
  24. BIT8 EQU 256
  25. BIT9 EQU 512
  26. BIT10 EQU 1024
  27. BIT11 EQU 2048
  28. BIT12 EQU 4096
  29. BIT13 EQU 8192
  30. BIT14 EQU 16384
  31. BIT15 EQU 32768
  32. *
  33. * CONDITION CODE BITS
  34. *   USED IN ORCC TO SET A CC BIT
  35. *
  36. N EQU BIT3
  37. Z EQU BIT2
  38. V EQU BIT1
  39. C EQU BIT0
  40. *
  41. * CONDITION CODE BIT MASKS
  42. *    USED IN ANDCC TO CLEAR SINGLE BITS
  43. *
  44. NN EQU $F7
  45. NZ EQU $FB
  46. NV EQU $FD
  47. NC EQU $FE
  48.  PAGE
  49. *
  50. *
  51. *
  52. *      STACK FRAME EQUATES
  53. *
  54. *
  55. *                  INITIALIZED BY:
  56. FUNCT EQU 0             IREG/ISTACK
  57. RPREC EQU FUNCT+1         IXIT
  58. TSTAT EQU RPREC+1         IXIT (0)
  59. TPARAM EQU TSTAT+2         IXIT (0)
  60. STIKY EQU TPARAM+2         IXIT (0)
  61. PTOS EQU STIKY+1         UNDEFINED FOR REG CALLS; ISTACK (0)
  62. PFPCB EQU PTOS+2         IREG/ISTACK
  63. RESULT EQU PFPCB+2         SET BY OPERATIONS
  64. SIGNR EQU RESULT
  65. EXPR EQU RESULT+1
  66. FRACTR EQU EXPR+2
  67. TYPER EQU FRACTR+9
  68. ARG2 EQU TYPER+1         SET BY GETARG
  69. SIGN2 EQU ARG2
  70. EXP2 EQU ARG2+1
  71. FRACT2 EQU EXP2+2
  72. TYPE2 EQU FRACT2+9
  73. ARG1 EQU TYPE2+1         SET BY GETARG IF DYADIC
  74. SIGN1 EQU ARG1
  75. EXP1 EQU ARG1+1
  76. FRACT1 EQU EXP1+2
  77. TYPE1 EQU FRACT1+9         IXIT (0); CHANGED BY GETARG IF DYADIC
  78. ARGSIZ EQU TYPE2-ARG2+1
  79. *
  80. * STACK CALLS
  81. ISTKPC EQU TYPE1+1         USER'S REGISTERS, SAVED BY PSHS
  82. CCREG EQU ISTKPC+2
  83. DREG EQU CCREG+1
  84. XREG EQU DREG+2
  85. YREG EQU XREG+2
  86. UREG EQU YREG+2
  87. CALLPC EQU UREG+2
  88. *
  89. * REGISTER CALLS
  90. IREGPC EQU TYPE1+1         USER'S REGISTERS; SAVED BY PSHS
  91. PFPCB2 EQU IREGPC+3
  92. PRESUL EQU PFPCB2+2
  93. PARG2 EQU PRESUL+2
  94. PARG1 EQU PARG2+2
  95. *
  96. * TOTAL SIZE OF STACK FRAME
  97. STKSIZ EQU CALLPC+2-FUNCT
  98. *
  99. * SIZE OF STACK FRAME FROM IREG OR ISTACK TO BOTTOM
  100. *
  101. FRMSIZ EQU ISTKPC-FUNCT
  102. *
  103. *
  104. * SIZE OF CALLERS REGS (EXCEPT PC)
  105. *
  106. SIZREG EQU CALLPC-CCREG
  107. *
  108. * OFFSETS FOR INDIVIDUAL ARGUMENTS ON STACK FRAME
  109. *
  110. SIGN EQU 0
  111. EXP EQU SIGN+1
  112. FRACT EQU EXP+2
  113. TYPE EQU FRACT+9
  114. *
  115. * ALIASES FOR SOME STACK FRAME ENTRIES
  116. *
  117. P    EQU  TPARAM+1         EQUATE USED IN DECBIN
  118. K    EQU  TPARAM+1         EQUATE USED IN BINDEC
  119.  PAGE
  120. *
  121. *  ARGUMENT TYPES
  122. *
  123. TYNORM EQU 0
  124. TYZERO EQU 2
  125. TYINF EQU 4
  126. TYNAN EQU 6
  127. TYNNRM EQU 8
  128. *
  129. * EXPONENT BIASES
  130. SBIAS EQU 127 SINGLE PRECISION BIAS
  131. DBIAS EQU 1023 DOUBLE PRECISION BIAS
  132. *
  133. * MISCELLANEOUS EQUATES
  134. *
  135. BIGIOP EQU 17 MAXIMUM LEGAL IOP NUMBER
  136.  PAGE
  137. *
  138. *
  139. *   FPCB REGISTER BYTE EQUATES
  140. *
  141. *
  142. * FPCB REGISTER EQUATES
  143. *
  144. CTL EQU 0 CONTROL REG
  145. ENB EQU 1 ENABLE BYTE
  146. ERR EQU 2 ERROR STATUS BYTE
  147. SS  EQU 3 SECONDARY STATUS
  148. * OFFSET OF ADDRESS TO JUMP TO FOR TRAP
  149. TRAPV EQU 4  TRAP VECTOR
  150. *
  151. *
  152. *
  153. * CONTROL BYTE
  154. *
  155. CTLAFF EQU BIT0 AFFINE/PROJECTIVE FLAG
  156. CTLRND EQU BIT1+BIT2 ROUNDING MODE
  157. CTLNRM EQU BIT3 NORMALIZE FLAG
  158. CTLSIZ EQU BIT5+BIT6+BIT7
  159.  
  160. *
  161. * ERROR STATUS BYTE
  162. *
  163. ERRIOP EQU BIT0 IOP ERROR
  164. ERROVF EQU BIT1 OVERFLOW ERROR
  165. ERRUNF EQU BIT2 UNDERFLOW ERROR
  166. ERRDZ EQU BIT3 DIVIDE BY ZERO ERROR
  167. ERRUN EQU BIT4 UNORDERED COMPARE ERROR
  168. ERRIOV EQU BIT5 INTEGER OVERFLOW ERROR
  169. ERRINX EQU BIT6 INEXACT ERROR
  170. *
  171. * TRAP ENABLE BYTE
  172. *
  173. ENBIOP EQU BIT0 INVALID OPERATION
  174. ENBOVF EQU BIT1 OVERFLOW
  175. ENBUNF EQU BIT2 UNDERFLOW
  176. ENBDZ EQU BIT3 DIVIDE BY ZERO
  177. ENBUN EQU BIT4 UNORDERED
  178. ENBIOV EQU BIT5 INTEGER OVERFLOW
  179. ENBINX EQU BIT6 INEXACT
  180. *
  181. * PRECISION MODES IN CONTROL BYTE
  182. *
  183. PRSIN EQU  00            SINGLE
  184. PRDBL EQU  BIT5         DOUBLE
  185. PREXT EQU  BIT6         EXTENDED
  186. PREFS EQU  BIT5+BIT6        EXTENDED FORCE TO SINGLE
  187. PREFD EQU  BIT7         EXTENDED FORCED TO DOUBLE
  188. *
  189. * ROUNDING MODES IN CONTROL BYTE
  190. *
  191. *
  192. RN EQU    00      ROUND TO NEAREST
  193. RZ EQU    BIT1      ROUND TO ZERO
  194. RP EQU    BIT2      ROUND TO PLUS INFINITY
  195. RM EQU    BIT2+BIT1 ROUND TO MINUS INFINITY
  196. *
  197. * PRECISION INDEXES IN RPREC
  198. *
  199. SIN EQU  00
  200. DBL EQU  02
  201. EXT EQU  04
  202. EFS EQU  06
  203. EFD EQU  08
  204. *
  205. * SECONDARY STATUS  BYTE
  206. *
  207. SSIOP EQU BIT0+BIT1+BIT2+BIT3+BIT4
  208.  PAGE
  209. *
  210. *
  211. *     FUNCTION CODE EQUATES
  212. *
  213. *     BIT 7 = 1 = MIXED SIZE ARGUMENTS (MOV,CMP)
  214. *     BIT 6 = 1 = TRAP ON UNORDERED COMPARE
  215. *     BIT5-BIT0 = FUNCTION NUMBER
  216. *
  217. *
  218. MIXED EQU BIT7
  219. TONUN EQU BIT6            TRAP ON UNORDERED
  220. *
  221. *
  222. FCADD EQU 0
  223. FCSUB EQU FCADD+2
  224. FCMUL EQU FCSUB+2
  225. FCDIV EQU FCMUL+2
  226. FCREM EQU FCDIV+2
  227. FCCMP EQU FCREM+2+MIXED
  228. FCTCMP EQU FCREM+4+MIXED+TONUN
  229. FCPCMP EQU FCREM+6+MIXED
  230. FCTPCM EQU FCREM+8+MIXED+TONUN
  231. FCSQRT EQU FCREM+10
  232. FCINT EQU FCSQRT+2
  233. FCFIXS EQU FCINT+2
  234. FCFIXD EQU FCFIXS+2
  235. FCMOV EQU FCFIXD+2+MIXED
  236. FCBNDC EQU FCFIXD+4
  237. FCAB EQU FCBNDC+2
  238. FCNEG EQU FCAB+2
  239. *
  240. *    THE FOLLOWING OPCODES DO NOT GO THROUGH
  241. *  A JUMP-ADDRESS TABLE.
  242. *    NOTE: THE 'FCAB' AND 'FCNEG' WILL
  243. *  NOT EVEN GO THROUGH THE DISPATCH ROUTINE.
  244. *
  245. FCNOJP EQU  FCNEG+2   MARKS OPCODES WITHOUT TABLES
  246. *
  247. FCDCBN EQU FCNOJP
  248. FCFLTS EQU FCDCBN+2
  249. FCFLTD EQU FCFLTS+2
  250. *
  251. *
  252. * EXPONENT EQUATES
  253. *
  254. * MAXIMUM EXPONENTS
  255. *
  256. SMAXEX EQU $0080  SINGLE
  257. DMAXEX EQU $0400  DOUBLE
  258. EMAXEX EQU $4000  EXTENDED
  259. *
  260. * MINIMUM EXPONENTS
  261. *
  262. SMINEX EQU $FF81  SINGLE
  263. DMINEX EQU $FC01  DOUBLE
  264. EMINEX EQU $C001  EXTENDED
  265. *
  266. INFEX  EQU $7FFF  INFINITE EXPONENT
  267. *
  268. *
  269.  PAGE
  270. *
  271. **************************************************************
  272. *
  273. *
  274. *     G L O B A L   M A C R O S
  275. *
  276. *
  277. **************************************************************
  278. *
  279. ****************
  280. *
  281. * SRD
  282. *   MACRO TO LOGICAL DOUBLE SHIFT D-REG N BITS RIGHT. (1 <= N <= 8)
  283. *
  284. *   CALL:  SRD N
  285. *
  286. SRD MACR
  287.  IFGT (\0)-8 LOOK FOR ILLEGAL CASES
  288.  FAIL *** SRD N; N <= 8 ***
  289.  ENDC
  290.  IFLT (\0)-1
  291.  FAIL *** SRD N; N >= 0 ***
  292.  ENDC
  293. * N IS OKAY; DO THE SHIFTS
  294.  IFEQ (\0)-8
  295.  LSRA
  296.  RORB
  297.  ENDC
  298.  IFGE (\0)-7
  299.  LSRA
  300.  RORB
  301.  ENDC
  302.  IFGE (\0)-6
  303.  LSRA
  304.  RORB
  305.  ENDC
  306.  IFGE (\0)-5
  307.  LSRA
  308.  RORB
  309.  ENDC
  310.  IFGE (\0)-4
  311.  LSRA
  312.  RORB
  313.  ENDC
  314.  IFGE (\0)-3
  315.  LSRA
  316.  RORB
  317.  ENDC
  318.  IFGE (\0)-2
  319.  LSRA
  320.  RORB
  321.  ENDC
  322.  IFGE (\0)-1
  323.  LSRA
  324.  RORB
  325.  ENDC
  326.  ENDM
  327.  PAGE
  328. *
  329. *****************
  330. *
  331. * SLD N
  332. *   MACRO TO LOGICALLY SHIFT D-REG N BITS OO
  333. *   THE LEFT. (1 <= N <= 8)
  334. *
  335. *   CALL: SLD N
  336. *
  337. *****************
  338. *
  339. SLD MACR
  340. * CATCH THE ILLEGAL CASES
  341.  IFGT (\0)-8
  342.  FAIL *** SSLD N; N <= 8 ***
  343.  ENDC
  344.  IFLT (\0)-1
  345.  FAIL *** SLD N; N >= 0 ***
  346.  ENDC
  347.  IFEQ (\0)-8
  348.  LSLB
  349.  ROLA
  350.  ENDC
  351.  IFGE (\0)-7
  352.  LSLB
  353.  ROLA
  354.  ENDC
  355.  IFGE (\0)-6
  356.  LSLB
  357.  ROLA
  358.  ENDC
  359.  IFGE (\0)-5
  360.  LSLB
  361.  ROLA
  362.  ENDC
  363.  IFGE (\0)-4
  364.  LSLB
  365.  ROLA
  366.  ENDC
  367.  IFGE (\0)-3
  368.  LSLB
  369.  ROLA
  370.  ENDC
  371.  IFGE (\0)-2
  372.  LSLB
  373.  ROLA
  374.  ENDC
  375.  IFGE (\0)-1
  376.  LSLB
  377.  ROLA
  378.  ENDC
  379.  ENDM
  380.  PAGE
  381. *
  382. *****************
  383. *
  384. * MOVE MACROS
  385. *   THIS SET OF MACROS MOVES A SOURCE OPERAND TO
  386. *   A DESTINATION OPERAND USING THE SPECIFIED
  387. *   REGISTER AS INTERMEDIATE.
  388. *
  389. *   MOV<A|B|D|X|Y|U|S> <SOURCE>,<DEST>
  390. *
  391. *****************
  392. *
  393. MOVD MACR
  394.      LDD \0
  395.      STD \1
  396.      ENDM
  397. *
  398. MOVA MACR
  399.      LDA \0
  400.      STA \1
  401.      ENDM
  402. *
  403. MOVB MACR
  404.      LDB \0
  405.      STB \1
  406.      ENDM
  407. *
  408. MOVX MACR
  409.      LDX \0
  410.      STX \1
  411.      ENDM
  412. *
  413. MOVY MACR
  414.      LDY \0
  415.      STY \1
  416.      ENDM
  417. *
  418. MOVU MACR
  419.      LDU \0
  420.      STU \1
  421.      ENDM
  422. *
  423. MOVS MACR
  424.      LDS \0
  425.      STS \1
  426.      ENDM
  427.  PAGE
  428. *
  429. **********************************************
  430. *
  431. * BIT MANIPULATION MACROS
  432. *   BSET  SET A BIT IN MEMORY
  433. *   BCLR  CLEAR A BIT IN MEMORY
  434. *
  435. *   SET OR CLEAR A BIT IN MEMORY. THE FORMAT
  436. *   OF THE CALL IS:
  437. *    BSET<A|B> <BIT#>,<MEMORY LOCATION>
  438. *    BCLR<A|B> <BIT#>,<MEMORY LOCATION>
  439. *
  440. *    THE A OR B REGISTER MUST BE SPECIFIED AND IT
  441. *    PROVIDES THE INTERMEDIATE SCRATCH REGISTER.
  442. *
  443. *    THE BIT NUMBER CAN BE ONE OR MORE BITS
  444. *
  445. **********************
  446. *
  447. BSETA MACR
  448.       LDA \1
  449.       ORA #(\0)
  450.       STA \1
  451.       ENDM
  452. *
  453. BSETB MACR
  454.       LDB \1
  455.       ORB #(\0)
  456.       STB \1
  457.       ENDM
  458. *
  459. BCLRA MACR
  460.       LDA \1
  461.       ANDA #(-(\0)-1)!.$FF
  462.       STA \1
  463.       ENDM
  464. *
  465. BCLRB MACR
  466.       LDB \1
  467.       ANDB  ((-(\0)-1)!.$FF
  468.       STB \1
  469.       ENDM
  470.  PAGE
  471. *
  472. ***********************************************
  473. *
  474. *  INCREMENT AND DECREMENT 16 BIT REGISTESS
  475. *
  476. ***********************************************
  477. *
  478. INCX MACR
  479.  LEAX 1,X
  480.  ENDM
  481. *
  482. DECX MACR
  483.  LEAX -1,X
  484.  ENDM
  485. *
  486. INCY MACR
  487.  LEAY 1,Y
  488.  ENDM
  489. *
  490. DECY MACR
  491.  LEAY -1,Y
  492.  ENDM
  493. *
  494. INCU MACR
  495.  LEAU 1,U
  496.  ENDM
  497. *
  498. DECU MACR
  499.  LEAU -1,U
  500.  ENDM
  501. *
  502. INCS MACR
  503.  LEAS 1,S
  504.  ENDM
  505. *
  506. DECS MACR
  507.  LEAS -1,S
  508.  ENDM
  509. *
  510. INCD MACR
  511.  INCB
  512.  BNE *+3
  513.  INCA
  514.  ENDM
  515. *
  516. DECD MACR
  517.  TSTB
  518.  BNE \.1
  519.  DECA
  520. \.1 DECB
  521.  ENDM
  522. *
  523.  
  524.  PAGE
  525. *
  526. ******************
  527. *
  528. *  IOP N
  529. *
  530. *    MACRO TO SET INVALID OPERATION STATUS BITS IN
  531. *    THE TEMPORARY STATUS BYTES ON THE STACK FRAME
  532. *    SETS IOP BIT AND INVALID OPERATION CODE.
  533. *
  534. *  CALL: IOP N
  535. *    WHERE N IS A VALID INVALID OPERATION NUMBER
  536. *   USES A REGISTER
  537. *
  538. * USES A-REGISTER
  539. *
  540. *****************
  541. *
  542. IOP MACR
  543. * CHECK FOR ILLEGAL CASES
  544.  IFLT (\0)-1
  545.  FAIL *** IOP N; N > 0 ***
  546.  ENDC
  547.  IFGT (\0)-BIGIOP
  548.  FAIL *** IOP N; N TOO BIG ***
  549.  ENDC
  550. * NOT ILLEGAL
  551.  LDA #(\0)
  552.  STA TSTAT+1,U SET INVALID OPERATION NUMBER
  553.  LDA TSTAT,U SET IOP BIT IN MAIN STATUS
  554.  ORA #ERRIOP
  555.  STA TSTAT,U
  556.  ENDM
  557.  PAGE
  558. ***********************************************************************
  559. *
  560. *    STRUCTURED MACROS FOR ASSEMBLY LANGUAGE PROGRAMMING THE 6809
  561. *    BY JOEL BONEY
  562. *       GREG WALKER
  563. *
  564. EXBUG EQU $F000
  565. STKTOP SET 0
  566. ISLONG SET 0
  567. PUSH MACR
  568. ***********************************************************************
  569. *
  570. *    PUSH --
  571. *        THIS MACRO SIMULATES A 7-LEVEL STACK USING SEVEN SYMBOLS
  572. *    WHOSE VALUES ARE REDEFINED TO BE THE VALUES ON THE STACK. THE
  573. *    SYMBOL "STKTOP" CONTAINS A NUMBER FROM 0 TO 7 WHICH INDICATES
  574. *    THE SYMBOL (S1 TO S7) THAT CONTAINS THE VALUE ON THE TOP OF THE
  575. *    STACK. A VALUE OF ZERO FOR STKTOP INDICATES THAT THE STACK IS
  576. *    EMPTY.
  577. *
  578. STKTOP SET STKTOP+1
  579.  IFEQ STKTOP-1
  580. S1 SET \0
  581. L1 SET ISLONG
  582.  EXIT
  583.  ENDC
  584.  IFEQ    STKTOP-2
  585. S2 SET      \0
  586. L2 SET ISLONG
  587.  EXIT
  588.  ENDC
  589.  IFEQ  STKTOP-3
  590. S3 SET \0
  591. L3 SET ISLONG
  592.  EXIT
  593.  ENDC
  594.  IFEQ STKTOP-4
  595. S4 SET \0
  596. L4 SET ISLONG
  597.  EXIT
  598.  ENDC
  599.  IFEQ STKTOP-5
  600. S5 SET \0
  601. L5 SET ISLONG
  602.  EXIT
  603.  ENDC
  604.  IFEQ STKTOP-6
  605. S6 SET \0
  606. L6 SET ISLONG
  607.  EXIT
  608.  ENDC
  609.  IFEQ STKTOP-7
  610. S7 SET \0
  611. L7 SET ISLONG
  612.  EXIT
  613.  ENDC
  614.  IFEQ STKTOP-8
  615. S8 SET \0
  616. L8 SET ISLONG
  617.  EXIT
  618.  ENDC
  619.  IFEQ STKTOP-9
  620. S9 SET \0
  621. L9 SET ISLONG
  622.  EXIT
  623.  ENDC
  624.  IFEQ STKTOP-10
  625. S10 SET \0
  626. L10 SET ISLONG
  627.  EXIT
  628.  ENDC
  629.  IFGT STKTOP-10
  630.  FAIL ** SYMBOL STACK OVERFLOW **
  631.  ENDC
  632.  ENDM
  633. POP MACR
  634. ***********************************************************************
  635. *
  636. *    POP --
  637. *        THE POP MACRO REMOVES THE TOPMOST ELEMENT FROM THE
  638. *    SIMULATED STACK.
  639. *
  640.  IFLE STKTOP
  641.  FAIL ** SYMBOL STACK UNDERFLOW **
  642.  ENDC
  643.  IFGT STKTOP
  644. STKTOP SET STKTOP-1
  645.  ENDC
  646.  ENDM
  647. BACK1 MACR
  648. ************************************************************************
  649. *
  650. *    BACK1    --
  651. *        THIS MACRO SETS THE ASSEMBLER'S LOCATION COUNTER TO
  652. *    THE VALUE ON THE TOP OF THE STACK. CODE GENERATED AFTER THIS
  653. *    MACRO IS CALLED WILL BE LOCATED AT THE ADDRESS CONTAINED ON
  654. *    THE TOP OF THE SYMBOL STACK.
  655. *        THE CONTENTS OF THE STACK ARE NOT CHANGED BY THIS
  656. *    MACRO.
  657. *
  658.  IFEQ STKTOP-1
  659.  ORG S1
  660. BCKLNG SET L1
  661.  EXIT
  662.  ENDC
  663.  IFEQ STKTOP-2
  664.  ORG S2
  665. BCKLNG SET L2
  666.  EXIT
  667.  ENDC
  668.  IFEQ STKTOP-3
  669.  ORG S3
  670. BCKLNG SET L3
  671.  EXIT
  672.  ENDC
  673.  IFEQ STKTOP-4
  674.  ORG S4
  675. BCKLNG SET L4
  676.  EXIT
  677.  ENDC
  678.  IFEQ STKTOP-5
  679.  ORG S5
  680. BCKLNG SET L5
  681.  EXIT
  682.  ENDC
  683.  IFEQ STKTOP-6
  684.  ORG S6
  685. BCKLNG SET L6
  686.  EXIT
  687.  ENDC
  688.  IFEQ STKTOP-7
  689.  ORG S7
  690. BCKLNG SET L7
  691.  EXIT
  692.  ENDC
  693.  IFEQ STKTOP-8
  694.  ORG S8
  695. BCKLNG SET L8
  696.  EXIT
  697.  ENDC
  698.  IFEQ STKTOP-9
  699.  ORG S9
  700. BCKLNG SET L9
  701.  EXIT
  702.  ENDC
  703.  IFEQ STKTOP-10
  704.  ORG S10
  705. BCKLNG SET S10
  706.  EXIT
  707.  ENDC
  708.  IFLE STKTOP
  709.  FAIL ** REFERENCE WAS MADE TO EMPTY SYMBOL STACK **
  710.  EXIT
  711.  ENDC
  712.  IFGT STKTOP-7
  713.  FAIL ** STACK TOP POINTER EXCEEDS STACK **
  714.  EXIT
  715.  ENDC
  716.  ENDM
  717. RELOP MACR
  718. **********************************************************************
  719. *
  720. *    RELOP --
  721. *        THIS MACRO CREATES A RELATIVE BRANCH INSTRUCTION
  722. *    FOR THE 'IF', 'WHILE', AND 'UNTIL' MACROS BASED ON THE
  723. *    RELATIONAL OPERATOR PASSED TO IT AS ITS FIRST ARGUMENT.
  724. *
  725.  IFC \0,EQ
  726.   IFEQ ISLONG
  727.   BNE *
  728.   EXIT
  729.   ENDC
  730.   IFEQ ISLONG-1
  731.   LBNE EXBUG
  732.   EXIT
  733.   ENDC
  734.  ENDC
  735.  IFC \0,NE
  736.   IFEQ ISLONG
  737.   BEQ *
  738.   EXIT
  739.   ENDC
  740.   IFEQ ISLONG-1
  741.   LBEQ EXBUG
  742.   EXIT
  743.   ENDC
  744.  ENDC
  745.  IFC \0,LE
  746.   IFEQ ISLONG
  747.   BGT *
  748.   EXIT
  749.   ENDC
  750.   IFEQ ISLONG-1
  751.   LBGT EXBUG
  752.   EXIT
  753.   ENDC
  754.  ENDC
  755.  IFC \0,LT
  756.   IFEQ ISLONG
  757.   BGE *
  758.   EXIT
  759.   ENDC
  760.   IFEQ ISLONG-1
  761.   LBGE EXBUG
  762.   EXIT
  763.   ENDC
  764.  ENDC
  765.  IFC \0,GE
  766.   IFEQ ISLONG
  767.   BLT *
  768.   EXIT
  769.   ENDC
  770.   IFEQ ISLONG-1
  771.   LBLT EXBUG
  772.   EXIT
  773.   ENDC
  774.  ENDC
  775.  IFC \0,GT
  776.   IFEQ ISLONG
  777.   BLE *
  778.   EXIT
  779.   ENDC
  780.   IFEQ ISLONG-1
  781.   LBLE EXBUG
  782.   EXIT
  783.   ENDC
  784.  ENDC
  785.  IFNC \0,EQ
  786.   IFNC \0,NE
  787.    IFNC \0,LT
  788.     IFNC \0,LE
  789.      IFNC \0,GE
  790.       IFNC \0,GT
  791.       FAIL ** INVALID RELATIONAL OPERATOR -- \0 **
  792.       EXIT
  793.       ENDC
  794.      ENDC
  795.     ENDC
  796.    ENDC
  797.   ENDC
  798.  ENDC
  799.  ENDM
  800. RELTST MACR
  801. *****************************************************************
  802. *
  803. *      RELTST --
  804. *         THE 'RELTST' MACRO TESTS THE VALIDITY OF THE
  805. *      RELATIONAL OPERATOR USED WITH THE 'IFTST' MACRO AND
  806. *      GENERATES THE PROPER RELATIVE BRANCH INSTRUCTION.
  807. *
  808.  IFC \0,EQ
  809.   IFEQ ISLONG
  810.   BNE *
  811.   EXIT
  812.   ENDC
  813.   IFEQ ISLONG-1
  814.   LBNE EXBUG
  815.   EXIT
  816.   ENDC
  817.  ENDC
  818.  IFC \0,NE
  819.   IFEQ ISLONG
  820.   BEQ *
  821.   EXIT
  822.   ENDC
  823.   IFEQ ISLONG-1
  824.   LBEQ EXBUG
  825.   EXIT
  826.   ENDC
  827.  ENDC
  828.  IFC \0,GE
  829.   IFEQ ISLONG
  830.   BLT *
  831.   EXIT
  832.   ENDC
  833.   IFEQ ISLONG-1
  834.   LBLT EXBUG
  835.   EXIT
  836.   ENDC
  837.  ENDC
  838.  IFC \0,LT
  839.   IFEQ ISLONG
  840.   BGE *
  841.   EXIT
  842.   ENDC
  843.   IFEQ ISLONG-1
  844.   LBGE EXBUG
  845.   EXIT
  846.   ENDC
  847.  ENDC
  848.  IFNC \0,EQ
  849.   IFNC \0,NE
  850.    IFNC \0,GE
  851.     IFNC \0,LT
  852.     FAIL ** \0 IS AN INVALID RELATIONAL OPERATOR FOR 'IFTST' **
  853.     EXIT
  854.     ENDC
  855.    ENDC
  856.   ENDC
  857.  ENDC
  858.  ENDM
  859. RELCC MACR
  860. **********************************************************************
  861. *
  862. *      RELCC --
  863. *         THE 'RELCC' MACRO TESTS THE VALIDITY OF THE RELATIONAL
  864. *      OPERATOR FOR THE 'IFCC' MACRO AND GENERATES THE PROPER RELATIVE
  865. *      BRANCH INSTRUCTION.
  866. *
  867.  IFC \0,EQ
  868.   IFEQ ISLONG
  869.   BNE *
  870.   EXIT
  871.   ENDC
  872.   IFEQ ISLONG-1
  873.   LBNE EXBUG
  874.   EXIT
  875.   ENDC
  876.  ENDC
  877.  IFC \0,NE
  878.   IFEQ ISLONG
  879.   BEQ *
  880.   EXIT
  881.   ENDC
  882.   IFEQ ISLONG-1
  883.   LBEQ EXBUG
  884.   EXIT
  885.   ENDC
  886.  ENDC
  887.  IFC \0,LE
  888.   IFEQ ISLONG
  889.   BGT *
  890.   EXIT
  891.   ENDC
  892.   IFEQ ISLONG-1
  893.   LBGT EXBUG
  894.   EXIT
  895.   ENDC
  896.  ENDC
  897.  IFC \0,LT
  898.   IFEQ ISLONG
  899.   BGE *
  900.   EXIT
  901.   ENDC
  902.   IFEQ ISLONG-1
  903.   LBGE EXBUG
  904.   EXIT
  905.   ENDC
  906.  ENDC
  907.  IFC \0,GE
  908.   IFEQ ISLONG
  909.   BLT *
  910.   EXIT
  911.   ENDC
  912.   IFEQ ISLONG-1
  913.   LBLT EXBUG
  914.   EXIT
  915.   ENDC
  916.  ENDC
  917.  IFC \0,GT
  918.   IFEQ ISLONG
  919.   BLE *
  920.   EXIT
  921.   ENDC
  922.   IFEQ ISLONG-1
  923.   LBLE EXBUG
  924.   EXIT
  925.   ENDC
  926.  ENDC
  927.  IFC \0,CC
  928.   IFEQ ISLONG
  929.   BCS *
  930.   EXIT
  931.   ENDC
  932.   IFEQ ISLONG-1
  933.   LBCS EXBUG
  934.   EXIT
  935.   ENDC
  936.  ENDC
  937.  IFC \0,CS
  938.   IFEQ ISLONG
  939.   BCC *
  940.   EXIT
  941.   ENDC
  942.   IFEQ ISLONG-1
  943.   LBCC EXBUG
  944.   EXIT
  945.   ENDC
  946.  ENDC
  947.  IFC \0,VC
  948.   IFEQ ISLONG
  949.   BVS *
  950.   EXIT
  951.   ENDC
  952.   IFEQ ISLONG-1
  953.   LBVS EXBUG
  954.   EXIT
  955.   ENDC
  956.  ENDC
  957.  IFC \0,VS
  958.   IFEQ ISLONG
  959.   BVC *
  960.   EXIT
  961.   ENDC
  962.   IFEQ ISLONG-1
  963.   LBVC EXBUG
  964.   EXIT
  965.   ENDC
  966.  ENDC
  967.  IFNC \0,EQ
  968.   IFNC \0,NE
  969.    IFNC \0,LT
  970.     IFNC \0,LE
  971.      IFNC \0,GE
  972.       IFNC \0,GT
  973. RELERR SET 1   ERROR FLAG FOR NEXT SET OF TESTS
  974.       ENDC
  975.      ENDC
  976.     ENDC
  977.    ENDC
  978.   ENDC
  979.  ENDC
  980.  IFNE RELERR
  981. RELERR SET 0
  982.   IFNC \0,CC
  983.    IFNC \0,VC
  984.     IFNC \0,CS
  985.      IFNC \0,VS
  986.      FAIL ** INVALID RELATIONAL OPERATOR -- \0 **
  987.      ENDC
  988.     ENDC
  989.    ENDC
  990.   ENDC
  991.  ENDC
  992.  ENDM
  993. REGTST MACR
  994. **********************************************************************
  995. *
  996. *    REGTST --
  997. *        THIS MACRO TESTS THE VALIDITY OF THE REGISTER
  998. *    NAME PASSED AS ITS FIRST ARGUMENT. IF THE NAME WAS NOT
  999. *    A VALID REGISTER, 'REGTST' WILL FAIL WITH AN ERROR MESSAGE.
  1000. *
  1001.  IFNC \0,A
  1002.  IFNC \0,B
  1003.  IFNC \0,D
  1004.  IFNC \0,X
  1005.  IFNC \0,Y
  1006.  IFNC \0,U
  1007.  IFNC \0,S
  1008.  FAIL ** \0 IS NOT A 6809 REGISTER **
  1009.  EXIT
  1010.  ENDC
  1011.  ENDC
  1012.  ENDC
  1013.  ENDC
  1014.  ENDC
  1015.  ENDC
  1016.  ENDC
  1017.  ENDM
  1018. IF MACR
  1019. **********************************************************************
  1020. *
  1021. *    IF --
  1022. *        THE 'IF' MACRO WILL CAUSE THE STATEMENTS FOLLOWING
  1023. *    IT TO BE EXECUTED UP TO THE FIRST 'ELSE' OR 'ENDIF' IF THE
  1024. *    CONDITIONAL EXPRESSION IS TRUE. ITS SYNTAX IS:
  1025. *
  1026. *    IF    <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  1027. *
  1028. *    THE VALID RELATIONAL OPERATORS ARE: 'EQ','NE','LE','LT',
  1029. *    'GE', AND 'GT'.
  1030. *
  1031.  IFNE NARG-3
  1032.   IFNC \3,L
  1033.   FAIL ** 'IF' MACRO REQUIRES 3 ARGUMENTS **
  1034.   ENDC
  1035.  ENDC
  1036.  IFC \3,L
  1037. ISLONG SET 1
  1038.  ENDC
  1039.  REGTST \0
  1040.  CMP\0 \2
  1041.  RELOP \1
  1042.  PUSH *-1-ISLONG
  1043. ISLONG SET 0
  1044.  ENDM
  1045. ELSE MACR
  1046. **********************************************************************
  1047. *
  1048. *    ELSE --
  1049. *        THE 'ELSE' MACRO BEGINS THE STATEMENTS THAT WILL
  1050. *    BE EXECUTED IF THE CONDITIONAL EXPRESSION OF THE PRECEDING
  1051. *    'IF' MACRO WAS NOT TRUE.
  1052. *
  1053.  IFC \0,L
  1054. ISLONG SET 1
  1055.  ENDC
  1056.  IFEQ ISLONG
  1057.  BRA *
  1058.  ENDC
  1059.  IFEQ ISLONG-1
  1060.  LBRA EXBUG
  1061.  ENDC
  1062. MCRTMP SET *
  1063.  BACK1
  1064.  IFEQ BCKLNG
  1065.  IFGT (MCRTMP-*-1)-128
  1066.  FAIL ** LONG 'IF' IS REQUIRED **
  1067.  ENDC
  1068.  FCB MCRTMP-*-1
  1069.  ENDC
  1070.  IFEQ BCKLNG-1
  1071.  FDB MCRTMP-*-2
  1072.  ENDC
  1073.  ORG MCRTMP
  1074.  POP
  1075.  PUSH *-1-ISLONG
  1076. ISLONG SET 0
  1077.  ENDM
  1078. ENDIF MACR
  1079. **********************************************************************
  1080. *
  1081. *    ENDIF --
  1082. *        THE 'ENDIF' MACRO IS THE TERMINATING STATEMENT FOR THE
  1083. *    STATEMENTS CONTROLLED BY THE PRECEDING 'IF' OR 'ELSE' MACRO.
  1084. *
  1085. MCRTMP SET *
  1086.  BACK1
  1087.  IFEQ BCKLNG
  1088.  IFGT (MCRTMP-*-1)-128
  1089.  FAIL ** LONG 'ELSE' REQUIRED **
  1090.  ENDC
  1091.  FCB MCRTMP-*-1
  1092.  ENDC
  1093.  IFEQ BCKLNG-1
  1094.  FDB MCRTMP-*-2
  1095.  ENDC
  1096.  ORG MCRTMP
  1097.  POP
  1098.  ENDM
  1099. IFTST MACR
  1100. **********************************************************************
  1101. *
  1102. *    IFTST --
  1103. *        THE 'IFTST' MACRO OPERATES LIKE AN 'IF' MACRO EXCEPT
  1104. *    THAT IT GENERATES A 'TST' INSTRUCTION INSTEAD OF A 'CMP'.
  1105. *    THE SYNTAX IS:
  1106. *
  1107. *    IFTST    <REGISTER OR ADDRESS EXPRESSION>,<RELATIONAL OP>,0
  1108. *
  1109. *    THE VALID RELATIONAL OPERATORS FOR USE WITH 'IFTST' ARE: 'EQ',
  1110. *    'NE', 'LT', AND 'GE'.
  1111. *
  1112.  IFC \3,L
  1113. ISLONG SET 1
  1114.  ENDC
  1115.  IFC \2,L
  1116. ISLONG SET 1
  1117.  ENDC
  1118.  IFC \0,A
  1119.  TSTA
  1120.  ENDC
  1121.  IFC \0,B
  1122.  TSTB
  1123.  ENDC
  1124.  IFNC \0,A
  1125.   IFNC \0,B
  1126.   TST \0
  1127.   ENDC
  1128.  ENDC
  1129.  RELTST \1
  1130.  PUSH *-1-ISLONG
  1131. ISLONG SET 0
  1132.  ENDM
  1133. IFCC MACR
  1134. **********************************************************************
  1135. *
  1136. *    IFCC --
  1137. *        THE 'IFCC' MACRO FUNCTIONS LIKE AN 'IF' MACRO, EXCEPT
  1138. *    IT ONLY GENERATES A 'BRANCH ON CONDITION' INSTRUCTION DIRECTLY.
  1139. *    THIS IS USEFUL BECAUSE IT ALLOWS THE ASSEMBLER TO GENERATE THE
  1140. *    LABEL FOR THE BRANCH INSTEAD OF FORCING THAT BURDEN ON THE
  1141. *    OVER-WORKED PROGRAMMER. THE SYNTAX IS:
  1142. *
  1143. *    IFCC   <RELATIONAL OPERATOR>
  1144. *
  1145. *    THE VALID REALTIONAL OPERATORS ARE: 'EQ', 'NE', 'GE', 'GT',
  1146. *    'LE', AND 'LT'.
  1147. *
  1148.  IFNE NARG-1
  1149.   IFNC \1,L
  1150.   FAIL ** ONLY ONE ARGUMENT (A RELATIONAL OPERATOR) ALLOWED **
  1151.   ENDC
  1152.  ENDC
  1153.  IFC \1,L
  1154. ISLONG SET 1
  1155.  ENDC
  1156.  RELCC \0
  1157.  PUSH *-1-ISLONG
  1158. ISLONG SET 0
  1159.  ENDM
  1160. WHILE MACR
  1161. **********************************************************************
  1162. *
  1163. *    WHILE --
  1164. *        THE 'WHILE' MACRO EXECUTES THE STATEMENTS FOLLOWING
  1165. *    IT UP TO THE 'ENDWH' AS LONG AS ITS CONDITIONAL EXPRESSION IS
  1166. *    TRUE. THE SNTAX IS:
  1167. *
  1168. *    WHILE <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  1169. *
  1170.  IFNE NARG-3
  1171.   IFNC \3,L
  1172.   FAIL ** 'WHILE' REQUIRES 3 ARGUMENTS **
  1173.   ENDC
  1174.  ENDC
  1175.  IFC \3,L
  1176. ISLONG SET 1
  1177.  ENDC
  1178.  PUSH *
  1179.  REGTST \0
  1180.  CMP\0 \2
  1181.  RELOP \1
  1182.  PUSH *-1-ISLONG
  1183. ISLONG SET 0
  1184.  ENDM
  1185. ENDWH MACR
  1186. **********************************************************************
  1187. *
  1188. *    ENDWH --
  1189. *        THIS MACRO TERMINATES THE STATEMENTS WITHIN A 'WHILE'
  1190. *    LOOP.
  1191. *
  1192.  IFC \0,L
  1193.   FAIL ** THE 'LONG' SHOULD BE PLACED ON THE 'WHILE' **
  1194.  ENDC
  1195. MCRTMP SET *
  1196.  BACK1
  1197.  IFEQ BCKLNG
  1198.   IFGT -((MCRTMP+2)-*-1)-128
  1199.   FAIL ** LONG 'WHILE' IS REQUIRED **
  1200.   ENDC
  1201.  FCB (MCRTMP+2)-*-1
  1202.  ENDC
  1203.  IFEQ BCKLNG-1
  1204.  FDB (MCRTMP+3)-*-2
  1205.  ENDC
  1206.  POP
  1207.  BACK1
  1208. \.A EQU *
  1209.  ORG MCRTMP
  1210.  IFEQ BCKLNG
  1211.  BRA \.A
  1212.  ENDC
  1213.  IFEQ BCKLNG-1
  1214.  LBRA \.A
  1215.  ENDC
  1216.  POP
  1217.  ENDM
  1218. REPEAT MACR
  1219. **********************************************************************
  1220. *
  1221. *    REPEAT --
  1222. *        THE STATEMENTS BETWEEN A 'REPEAT' AND AN 'UNTIL' MACRO
  1223. *    ARE REPEATED UNTIL THE CONDITIONAL EXPRESSION BECOMES TRUE.
  1224. *
  1225.  IFC \0,L
  1226.   FAIL ** PLACE 'LONG' ON THE 'UNTIL' **
  1227.  ENDC
  1228.  PUSH *
  1229.  ENDM
  1230. UNTIL MACR
  1231. **********************************************************************
  1232. *
  1233. *    UNTIL --
  1234. *        THE 'UNTIL' MACRO TERMINATES A 'REPEAT' LOOP. IT HAS
  1235. *    THE SYNTAX:
  1236. *
  1237. *    UNTIL  <REGISTER NAME>,<RELATIONAL OPERATOR>,<ADDRESS EXPRESSION>
  1238. *
  1239.  IFNE NARG-3
  1240.   IFNC \3,L
  1241.   FAIL ** 'UNTIL' REQUIRES 3 ARGUMENTS **
  1242.   ENDC
  1243.  ENDC
  1244.  IFC \3,L
  1245. ISLONG SET 1
  1246.  ENDC
  1247. MCRTMP SET *
  1248.  BACK1
  1249. \.A EQU *
  1250.  ORG MCRTMP
  1251.  POP
  1252.  REGTST \0
  1253.  CMP\0 \2
  1254.  RELOP \1
  1255.  ORG *-1-ISLONG
  1256.  IFEQ ISLONG
  1257.   IFGT -(\.A-*-1)-128
  1258.   FAIL ** LONG 'UNTIL' IS REQUIRED **
  1259.   ENDC
  1260.   FCB \.A-*-1
  1261.  ENDC
  1262.  IFEQ ISLONG-1
  1263.  FDB \.A-*-2
  1264.  ENDC
  1265. ISLONG SET 0
  1266.  ENDM
  1267. *
  1268. *
  1269. *
  1270. *
  1271.  PAG
  1272. *
  1273. *
  1274. *
  1275. ************************************************
  1276. *
  1277. *   S H I F T    M A C R O S
  1278. *
  1279. ************************************************
  1280. *
  1281. *
  1282. *
  1283. *
  1284. RSHIFT MACR
  1285. *
  1286. *
  1287. *  THIS MACRO DOES A RIGHT SHIFT ON A MULTI-
  1288. * PRECISION OPERAND THAT IS UP TO 10 BYTES
  1289. * LONG, WHOSE MOST SIG. BYTE IS POINTED TO
  1290. * BY EITHER 0FF,X , OFF,Y , OR OFF,U; WHERE
  1291. * "OFF" IS A CONSTANT OFFSET SPECIFIED UPON
  1292. * INVOCATION OF THE MACRO. THE CARRY IS SHIFTED
  1293. * IN FROM THE RIGHT.
  1294. *
  1295. *
  1296. * TO INVOKE RSHIFT:
  1297. *
  1298. *     RSHIFT  <"OFF">,< X, Y OR U >,< BYTE LENGTH >
  1299. *
  1300. * CHECK FOR PROPER NO. OF ARGUMENTS
  1301. *
  1302.  IFNE  NARG-3
  1303.    FAIL  ** TO FEW OR TO MANY ARGUMENTS **
  1304.    EXIT
  1305.  ENDC
  1306. *
  1307. * CHECK FOR PROPER POINTER REG.( X , Y OR U )
  1308. *
  1309.  IFNC  \1,X
  1310.    IFNC  \1,Y
  1311.      IFNC  \1,U
  1312.        FAIL  ** \1 IS AN INVALID POINTER REG. **
  1313.        EXIT
  1314.      ENDC
  1315.    ENDC
  1316.  ENDC
  1317. *
  1318. * CHECK NO. OF BYTES ARGUMENT; MUST BE > 0
  1319. * AND <= 10.
  1320. *
  1321.  IFLE  \2
  1322.    FAIL  ** SHIFT BYTE COUNT MUST BE > 0 **
  1323.    EXIT
  1324.  ENDC
  1325. *
  1326.  IFGT  \2-10
  1327.    FAIL  ** SHIFT BYTE COUNT MUST BE <= 10 **
  1328.    EXIT
  1329.  ENDC
  1330. *
  1331. * START CODE GENERATION
  1332. *
  1333.  ROR  \0,\1
  1334.  IFGT  (\2)-1
  1335.    ROR    (\0)+1,\1
  1336.  ENDC
  1337.    IFGT  (\2)-2
  1338.      ROR  (\0)+2,\1
  1339.    ENDC
  1340.      IFGT  (\2)-3
  1341.        ROR  (\0)+3,\1
  1342.      ENDC
  1343.        IFGT  (\2)-4
  1344.      ROR  (\0)+4,\1
  1345.        ENDC
  1346.      IFGT  (\2)-5
  1347.        ROR    (\0)+5,\1
  1348.      ENDC
  1349.        IFGT  (\2)-6
  1350.          ROR  (\0)+6,\1
  1351.        ENDC
  1352.          IFGT  (\2)-7
  1353.            ROR  (\0)+7,\1
  1354.          ENDC
  1355.            IFGT  (\2)-8
  1356.          ROR  (\0)+8,\1
  1357.            ENDC
  1358.          IFGT  (\2)-9
  1359.            ROR    (\0)+9,\1
  1360.          ENDC
  1361. *
  1362. *
  1363.  ENDM
  1364. *
  1365. *
  1366. *
  1367.  PAG
  1368. *
  1369. *
  1370. *
  1371. *
  1372. *
  1373. LSHIFT MACR
  1374. *
  1375. *
  1376. *  THIS MACRO DOES A LEFT SHIFT ON A MULTI-
  1377. * PRECISION OPERAND THAT IS UP TO 10 BYTES
  1378. * LONG, WHOSE MOST SIG. BYTE IS POINTED TO
  1379. * BY EITHER 0FF,X , OFF,Y , OR OFF,U; WHERE
  1380. * "OFF" IS A CONSTANT OFFSET SPECIFIED UPON
  1381. * INVOCATION OF THE MACRO. THE CARRY IS SHIFTED
  1382. * IN FROM THE LEFT.
  1383. *
  1384. * TO INVOKE LSHIFT:
  1385. *
  1386. *     LSHIFT  <"0FF">,< X,Y OR U >,< BYTE LENGTH >
  1387. *
  1388. * CHECK FOR PROPER NO. OF ARGUMENTS
  1389. *
  1390.  IFNE  NARG-3
  1391.    FAIL  ** TO FEW OR TO MANY ARGUMENTS **
  1392.    EXIT
  1393.  ENDC
  1394. *
  1395. * CHECK FOR PROPER POINTER REG.( X OR Y )
  1396. *
  1397.  IFNC  \1,X
  1398.    IFNC  \1,Y
  1399.      IFNC  \1,U
  1400.        FAIL  ** \1 IS AN INVALID POINTER REG. **
  1401.        EXIT
  1402.      ENDC
  1403.    ENDC
  1404.  ENDC
  1405. *
  1406. * CHECK NO. OF BYTES ARGUMENT; MUST BE > 0
  1407. * AND <= 10.
  1408. *
  1409.  IFLE  \2
  1410.    FAIL  ** SHIFT BYTE COUNT MUST BE > 0 **
  1411.    EXIT
  1412.  ENDC
  1413. *
  1414.  IFGT  \2-10
  1415.    FAIL  ** SHIFT BYTE COUNT MUST BE <= 10 **
  1416.    EXIT
  1417.  ENDC
  1418. *
  1419. * START CODE GENERATION
  1420. *
  1421.  ROL  (\0)+(\2)-1,\1
  1422.  IFGT  (\2)-1
  1423.    ROL    (\0)+(\2)-2,\1
  1424.  ENDC
  1425.    IFGT  (\2)-2
  1426.      ROL  (\0)+(\2)-3,\1
  1427.    ENDC
  1428.      IFGT  (\2)-3
  1429.        ROL  (\0)+(\2)-4,\1
  1430.      ENDC
  1431.        IFGT  (\2)-4
  1432.      ROL  (\0)+(\2)-5,\1
  1433.        ENDC
  1434.      IFGT  (\2)-5
  1435.        ROL    (\0)+(\2)-6,\1
  1436.      ENDC
  1437.        IFGT  (\2)-6
  1438.          ROL  (\0)+(\2)-7,\1
  1439.        ENDC
  1440.          IFGT  (\2)-7
  1441.            ROL  (\0)+(\2)-8,\1
  1442.          ENDC
  1443.            IFGT  (\2)-8
  1444.          ROL  (\0)+(\2)-9,\1
  1445.            ENDC
  1446.          IFGT  (\2)-9
  1447.            ROL    (\0)+(\2)-10,\1
  1448.          ENDC
  1449. *
  1450. *
  1451.  ENDM
  1452. *
  1453. *
  1454.  PAG
  1455. *
  1456. *
  1457. *
  1458.